package IO;

import java.io.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Microsoft
 * Date: 2023-07-28
 * Time: 20:29
 */
public class IODemo9 {
    public static void main(String[] args) {
        //1.先让用户指定一个要搜索的根目录
        System.out.println("请输入要扫描的根目录：");
        Scanner scanner = new Scanner(System.in);
        File rootDir = new File(scanner.next());
        //判断根目录是否存在
        if (!rootDir.isDirectory()) {
            System.out.println("输入有误，想输入的目录不存在");
            return;
        }
        //2.让用户输入一个要查询的关键词
        System.out.println("请输入要查询的词");
        String word = scanner.next();

        //3.递归进行目录/文件的遍历
        scanDir(rootDir,word);
    }

    private static void scanDir(File rootDir, String word) {
        //列出当前的rootDir中的内容，没内容直接递归结束
        File[] files = rootDir.listFiles();
        if (files == null) {
            //当前rootDir是一个空的目录，这里啥都没有
            //就没有必要递归了，直接return
            return;
        }

        //目录里有内容，就遍历目录中的元素
        for (File f:files) {
            if (f.isFile()) {
                //是文件
                //打开文件，读取内容，比较看是否包含关键词
                String content = readFile(f);
                if (content.contains(word)) {
                    System.out.println(f.getAbsolutePath()+"包含要查找的关键字");
                }
            }else if (f.isDirectory()){
                //是目录
                //进行递归操作
                scanDir(f,word);//以当前f这个目录为起点，再进行递归搜索
            }else {
                //不是普通文件，也不是目录文件，直接跳过
                return;
            }
        }
    }

    private static String readFile(File f) {
        //读取文件的整个内容
        //使用字符流读取，因为我们匹配的字符串，所以按照字符流进行处理
        StringBuilder stringBuilder = new StringBuilder();
        try (Reader reader = new FileReader(f)){
            //一次读一个字符，把读到的结果给拼装到StringBuilder中，统一转成String
            while (true) {
                int c =reader.read();
                if (c == -1) {
                    break;
                }
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return stringBuilder.toString();
    }
}
















